﻿using GroceryList.Domain.Model.Product;
using GroceryList.Model;

namespace GroceryList.Domain.Model.GroceryList
{
    public class DetalleProducto
    {
        protected DetalleProducto()
        {
            Estado = EstadoDelDetalle.Desde(EstadoDetalle.Pendiente);
        }

        internal DetalleProducto(ListaCompra listaCompra, Producto producto, int cantidad, string observaciones): this()
        {
            _lista = listaCompra;
            Producto = producto;
            Cantidad = cantidad;
            Observaciones = observaciones;
        }

        private readonly ListaCompra _lista;
        public virtual Producto Producto { get; set; }
        public virtual int Cantidad { get; set; }
        public virtual string Observaciones { get; set; }
        public virtual EstadoDelDetalle Estado { get; set; }

        public override bool Equals(object obj)
        {
            return Equals(obj as DetalleProducto);
        }

        public virtual bool Equals(DetalleProducto other)
        {
            if (ReferenceEquals(null,other)) return false;
            if (ReferenceEquals(this,other)) return true;
            return 
                Equals(other._lista,_lista) && 
                Equals(other.Producto,Producto);
        }

        public override int GetHashCode()
        {
            unchecked
            {
                return (_lista.GetHashCode()*397) ^ Producto.GetHashCode();
            }
        }
    }
}
